Laurea in Ingegneria Gestionale, Corso di

Progettazione del Software

Edizione dell'a.a. 2007/08

Materiale di autovalutazione AUTOV.Java.4 - Esercizi

Questa sezione è costituita da due parti.

La parte "Domande" ha la funzione di aiutare lo studente nell'autovalutazione e nell'individuazione degli argomenti che gli sono poco chiari. Le soluzioni non verranno fornite in classe. Il docente rimane comunque a disposizione per eventuali dubbi. Si fa notare che il modo migliore per le domande che riguardano linee di codice è quello di scrivere un breve programma di prova e compilarlo...

La parte "Esercizi di programmazione" contiene alcuni esercizi che gli studenti sono invitati a svolgere. Le soluzioni di alcuni di essi non verranno pubblicate, in quanto la verifica della loro correttezza può essere effettuata dagli stessi studenti scrivendo brevi moduli cliente.

Domande

  1. Cos'è una classe Wrapper?
  2. Come funziona il meccanismo delle eccezioni?
  3. Che differenza c'è tra le keyword java throw e throws?
  4. A cosa serve la keyword finally?
  5. Si consideri la classe:
    class MiaEccezione extends Exception {
    	//vuota...
    }	
    Le seguenti definizioni di metodo contengono alcuni errori. Cosa stampano i metodi una volta corretti?
    public static void a1(){
    try{
    	throw new MiaEccezione();
    	System.out.println("uno");
    }
    catch(MiaEccezione e){
    	System.out.println("due");
    }
    System.out.println("tre");
    }
    
    public static void a2() throws MiaEccezione{
    	try{
    		System.out.println("uno");
    		throw new MiaEccezione();
    	}
    	finally{
    		System.out.println("due");
    	}
    	System.out.println("tre");
    }
    
  6. Dati i seguenti metodi:
    public static void m1(boolean flag){
    try{
    	m2(flag);
    }
    catch(MiaEccezione e) {
    	System.out.println("4");	
    }
    System.out.println("5");
    }
    
    public static void m2(boolean flag) throws MiaEccezione {
    try{
    		m3(flag);
    		throw new MiaEccezione();
    	}
    	catch(TuaEccezione e){
    	System.out.println("2");
    }
    System.out.println("3");
    }
    
    public static void m3(boolean lancia){
    	if(lancia) throw new TuaEccezione();
    	System.out.println("1");
    }
    
    1. Di che tipo deve essere TuaEccezione perché il codice venga compilato?
    2. Cosa viene stampato a fronte delle due seguenti invocazioni?
      m1(true);
      m2(false);
      		
  7. Il seguente frammento di codice non compila a causa dell'ordine dei blocchi catch. Perché*?
    public static void b() {
    	(new int[2])[3]=5;
    	try{
    		throw new MiaEccezione();
    	}
    	catch(Exception e){
    		System.out.println("Ho catturato una Exception");
    	}
    	catch(RuntimeException e){
    		System.out.println("Ho catturato una RuntimeException");
    	}
    	catch(MiaEccezione e){
    		System.out.println("Ho catturato una MiaEccezione");
    	}	
    	finally{
    		System.out.println("Sono nel Finally");
    	}	
    }
    	
    Oltre a invertire l'ordine dei blocchi, quale altra correzione occorre fare al codice perché il programma termini correttamente? Cosa stampa?

    *Si fa presente che:

    1. Se in un blocco try viene lanciata un'eccezione, la virtual machine cerca un blocco catch che può gestirla esaminandoli nell'ordine in cui sono specificati;
    2. Non possibile dichiarare nello stesso try...catch due blocchi catch che gestiscono la stessa eccezione (ad esempio due catch(MyException e){...}).

Esercizi di programmazione

Al termine del modulo sul Java Collections Framework (parte JOO), un esercizio chiede di scrivere, in modo analogo a InsiemeArray, InsiemeArrayOmogeneo, InsiemeLista, InsiemeListaOmogeneo, le classi ListaArray, ListaArrayOmogenea, ListaCollegata e ListaCollegataOmogenea che implementano l'interfaccia java.util.List.

I seguenti esercizi chiedono di utilizzare tali classi.

  1. Scrivere un breve programma che crei e permetta di manipolare una lista di valori double.
  2. Scrivere una classe Matrice, che implementa una matrice MxN che si espande automaticamente quando vengono aggiunti nuove righe/colonne. La classe deve rappresentare le righe e colonne come liste (ovvero oggetti di classi che implementano java.util.List). Si fa notare che, se vengono aggiunte righe o colonne con un numero erroneo di elementi, il metodo corrispondente deve lanciare un'eccezione appropriata.
  3. Scrivere una classe Calcolatrice che metta a disposizione le quattro operazioni fondamentali fra interi. I metodi devono lanciare un'eccezione se si verifica una delle seguenti condizioni:
    1. Tentativo di divisione per zero;
    2. Overflow (la somma di due valori supera il massimo intero rappresentabile).
  4. Scrivere un programma che utilizza la classe suddetta accettando in input* due interi e un simbolo di operazione, e che restituisce il risultato se il calcolo va a buon fine, e visualizza un messaggio di spiegazione dell'errore altrimenti.

    * Si ricorda che si possono passare argomenti ad un programma Java specificandoli sulla linea di comando, e che i valori di tali argomenti vengono rappresentati come stringhe nell'array args[] che costituisce il parametro formale del metodo main(). Si guardi la documentazione della classe String per indicazioni su come convertire una stringa in un carattere (per la gestione dell'operatore).